﻿/*************************************************************************
 * 文件名称 ：JsonExtension.cs                          
 * 描述说明 ：Json格式通用操作类
 * 
 * 创建信息 : create by zhangpeng 2012-02-03
 * 修订信息 : modify by zhangpeng on 2015-11-13 for 采用第三方json.net，序列化和反序列化性能更高
 * 
 * 版权信息 : Copyright (c) 2015 OMH.Software
 **************************************************************************/

using System;
using System.Text.RegularExpressions;
using Newtonsoft.Json;

namespace Ledict.Utility.Extension
{
    /// <summary>
    /// Json格式通用操作类
    /// </summary>
    /// <remarks>
    /// Create Date：2012-02-03
    /// Create Author：Zhangpeng
    /// Version：1.1，修改了转换json格式时间的方法
    /// </remarks>
    public static class JsonExtension
    {
        #region Method
        /// <summary>
        /// 对象序列化成json格式字符串
        /// </summary>
        /// <param name="obj">当前对象</param>
        /// <returns>json格式字符串</returns>
        public static string ToJson(this object obj)
        {
            /* 之前的序列化方法，直接调用微软自己的System.Web.Script.Serialization;
            var ser = new JavaScriptSerializer();
            ser.Serialize(obj);
             */
            //最新的序列化方法，调用第三方json.net,性能更好
            return JsonConvert.SerializeObject(obj);
        }

        /// <summary>
        /// json格式字符串反序列化成指定对象
        /// </summary>
        /// <typeparam name="TResult">指定对象类型</typeparam>
        /// <param name="strJson">json格式字符串</param>
        /// <returns>指定对象</returns>
        public static TResult FromJson<TResult>(this string strJson)
        {
            //转换json格式时间为标准时间表示法
            //替换Json的Date字符串    
            strJson = Regex.Replace(strJson, @"\\/Date\((\d+)\)\\/", match =>
            {
                var dt = new DateTime(1970, 1, 1);
                dt = dt.AddMilliseconds(long.Parse(match.Groups[1].Value));
                dt = dt.ToLocalTime();
                return dt.ToString("yyyy-MM-dd HH:mm:ss");
            });
            /* 之前的序列化方法，直接调用微软自己的System.Web.Script.Serialization;
            var ser = new JavaScriptSerializer();
            return ser.Deserialize<TResult>(strJson);
             *  */
            //最新的反序列化方法，调用第三方json.net,性能更好
            return JsonConvert.DeserializeObject<TResult>(strJson);

        }
        #endregion
    }
}